package edu.pmfbl.mnr.sem.mcmatm.app;


import java.awt.*;

import com.borland.jb.util.Diagnostic;
import com.borland.dx.dataset.*;

import edu.pmfbl.mnr.sem.mcmatm.gui.*;

/**
 * <p>Title: MCMA Test Maker</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2009</p>
 *
 * <p>Company: KrndijaSoft</p>
 *
 * @author Ninoslav Krndija
 * @version 1.0
 */

/**
 * Rukovaoc izuzecima tipa DataSetException za cijelu aplikaciju. U
 * konstruktoru klase AppDataModule, DataSetExceptionHandler je registrovan
 * kao rukovaoc izuzecima tipa DataSetException za cijelu aplikaciju.
 * To znaci da ce registrovani rukovaoc zamijeniti standardni tj.
 * bice pozvan svaki put kada se dogodi izuzetak tipa DataSetException.
 */
public class DataSetExceptionHandler implements ExceptionListener
{
  private AppDataModule appDataModule;

  public DataSetExceptionHandler(AppDataModule appDataModule)
  {
    this.appDataModule = appDataModule;
  }

  public void exception(ExceptionEvent event)
  {
    Component component = event.getComponent();
    Component srcComp = component ;
    Frame frame = null;

    while(component != null)
    {
      if(component instanceof Frame)
      {
        frame = (Frame) component;
        break;
      }
      component = component.getParent();
    }

    if(frame == null)
      frame = new Frame();

    if(MessageDialog.getShowCount() > 0)
      return ;
    MessageDialog message = new MessageDialog(frame);
    message.setSource(srcComp);
    String messageString = null;
    int errorCode;

    if(event.getException() instanceof DataSetException)
      errorCode = ((DataSetException) event.getException()).getErrorCode();
    else
      errorCode = -1;

    // Ako bar jedno polje nedostaje.
    // Pronalazi prazno polje i prikazuje njegovo ime na dijalogu poruke o gresci.
    if(errorCode == ValidationException.INVALID_ROW_VALUES)
    {
      try
      {
        if(event.getDataSet() == appDataModule.getPitanjaDataSet())
        {
          String [] requiredFields = new String [] {"naziv", "tekstpitanja", "info",
              "tacanodgovorinfo", "djelimicanodgovorinfo", "netacanodgovorinfo"};

          for(int i = 0; i < requiredFields.length; i++)
          {
            if(appDataModule.getPitanjaDataSet().getString(requiredFields[i]).length() == 0)
            {
              messageString = "Unesite " + appDataModule.getPitanjaDataSet().getColumn(requiredFields[i]).getCaption();
              break;
            }
          }
        }
        /*else
          if(event.getDataSet() == appDataModule.getViseizboraDataSet())
          {
            String [] requiredFields = new String [] {"mijesanjeodgovora", "tacanodgovorinfo",
                                                      "djelimicanodgovorinfo", "netacanodgovorinfo"};
            for(int i = 0; i < requiredFields.length; i++)
            {
              if (appDataModule.getViseizboraDataSet().getString(requiredFields[i]).length() == 0)
              {
                messageString = "Unesite " + appDataModule.getViseizboraDataSet().getColumn(requiredFields[i]).getCaption();
                break;
              }
            }
          }*/
          else
            if(event.getDataSet() == appDataModule.getOdgovoriDataSet())
            {
              String [] requiredFields = new String [] {"odgovor", "info"};
              for(int i = 0; i < requiredFields.length; i++)
              {
                if (appDataModule.getOdgovoriDataSet().getString(requiredFields[i]).length() == 0)
                {
                  messageString = "Unesite " + appDataModule.getOdgovoriDataSet().getColumn(requiredFields[i]).getCaption();
                  break;
                }
              }
            }
      }
      catch(Exception e)
      {
        com.borland.jb.util.Diagnostic.printStackTrace(e);
      }
    }
    else
      if((errorCode == ValidationException.LESS_THAN_MIN) &&
               ((ValidationException) event.getException()).getErrorColumn().getColumnName().equals("bodovi"))
      {
        messageString = "Pitanje ne moze nositi manje od jednog boda.";
      }
      else
        if(errorCode == ValidationException.INVALID_FORMAT)
        {
          messageString = "Pitanje ne moze nositi manje od jednog boda.";
        }
        else
          // Korisnik pokusava da promijeni vrijednost u read-only kolonu
          if(errorCode == ValidationException.READ_ONLY_COLUMN)
          {
          }
          else
            if((errorCode == ValidationException.INSERT_NOT_ALLOWED) ||
               (errorCode == ValidationException.DELETE_NOT_ALLOWED))
            {
              return;
            }

    // Ako nemamo poruku za nastali izuzetak (izuzetak nije obradjen)
    if(messageString == null)
    {
      messageString = event.getException().getMessage();
    }

    message.setMessage(messageString);
    message.setVisible(true);
  }

}
